// type BEM<B extends string, E extends string[], M extends string[], S extends number = 1> = S extends 1
//     ? E extends [infer P, ...infer R]
//         ? R extends [] 
//             ? BEM<`${B}__${P}`, R, M, 2>
//             : BEM<`${B}__${P}`, R, M, 2> | BEM<B, R, M, 1>
//         : BEM<`${B}`, R, M, 2>
//     : S extends 2
//         ? M extends [infer P, ...infer R]
//             ? R extends []
//                 ? `${B}--${P}`
//                 : `${B}--${P}` | BEM<B, E, R, 2>
//             : B
//         : never


type BEM<B extends string, E extends string[], M extends string []> = 
    `${B}${E extends [] ? '' : `__${E[number]}`}${M extends [] ? '' : `--${M[number]}`}`